﻿#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdbool.h>
/*
给定字符串 s 和 t ，判断 s 是否为 t 的子序列。

字符串的一个子序列是原始字符串删除一些（也可以不删除）字符而不改变剩余字符相对位置形成的新字符串。
（例如，"ace"是"abcde"的一个子序列，而"aec"不是）。

进阶：

如果有大量输入的 S，称作 S1, S2, ... , Sk 其中 k >= 10亿，你需要依次检查它们是否为 T 的子序列。在这种情况下，
你会怎样改变代码
*/

//方法---双指针
/*
本题询问的是，sss 是否是 ttt 的子序列，因此只要能找到任意一种 sss 在 ttt 中出现的方式，即可认为 sss 是 ttt 的子序列。

而当我们从前往后匹配，可以发现每次贪心地匹配靠前的字符是最优决策。

假定当前需要匹配字符 ccc，而字符 ccc 在 ttt 中的位置 x1x_1x
1
​
  和 x2x_2x
2
​
  出现（x1<x2x_1 < x_2x
1
​
 <x
2
​
 ），那么贪心取 x1x_1x
1
​
  是最优解，因为 x2x_2x
2
​
  后面能取到的字符，x1x_1x
1
​
  也都能取到，并且通过 x1x_1x
1
​
  与 x2x_2x
2
​
  之间的可选字符，更有希望能匹配成功。

这样，我们初始化两个指针 iii 和 jjj，分别指向 sss 和 ttt 的初始位置。每次贪心地匹配，匹配成功则 iii 和 jjj 同时右移，
匹配 sss 的下一个位置，匹配失败则 jjj 右移，iii 不变，尝试用 ttt 的下一个字符匹配 sss。

最终如果 iii 移动到 sss 的末尾，就说明 sss 是 ttt 的子序列


*/


bool isSubsequence(char* s, char* t) 
{
	int n = strlen(s), m = strlen(t);
	int i = 0, j = 0;
	while (i < n && j < m)
	{
		if (s[i] == t[j])//条件判断
		{
			i++;
		}
		j++;
	}
	return i == n;//如果相当着返回 true 不相等则 false
}